﻿/*
通用脚本检测函数
verifyInput(c_id, c_null, c_type, c_minsize, c_maxsize, c_compare)
参数说明:
c_id:       验证控件标识
c_null:     必填验证（表示输入值是否允许为空；为yes时允许为空。）
c_type:     验证类别（EN(英文),CN(中文),NUM(实数),INT(整数),DATE(短日期),EMAIL(邮件) CARD(身份证),MOB(手机),TEL(电话),URL(网址),IP(IP地址),ID1(英文帐号),ID2(中英文帐号)）
c_minisize: 允许输入的最小长度,单位字节
c_maxsize:  允许输入的最大长度,单位字节
c_compare:  比较验证控件标识（比较是否与某项(ID)值相同）
作者：吴绪伟
开发日期：2009-4-15
*/
var error = false;
function verifyInput(c_id, c_name, c_null, c_type, c_minsize, c_maxsize, c_compare) {
    var msg = "";
    var v = document.getElementById(c_id).value;
    if ((c_null != undefined) && (c_null != "") && (error == false)) {
        if (c_null == "NO" && isnull(v)) {
            //为空校验 
            msg += c_name + "不能为空\n";
            error = true;
        }
    }

    if ((c_type != undefined) && (c_type != "") && (v != "") && (error == false)) {
        //检查类型 
        switch (c_type) {
            case "EN":
                if (isType(c_type, v) == false) {
                    msg += c_name + "只能输入英文字符\n";
                    error = true;
                }
                break;
            case "CN":
                if (isType(c_type, v) == false) {
                    msg += c_name + "只能输入中文字符\n";
                    error = true;
                }
                break;
            case "NUM":
                if (isType(c_type, v) == false) {
                    msg += c_name + "应该全为数字\n";
                    error = true;
                }
                break;
            case "INT":
                if (isType(c_type, v) == false) {
                    msg += c_name + "只能输入整数\n";
                    error = true;
                }
                break;
            case "DATE":
                if (isType(c_type, v) == false) {
                    msg += c_name + "填写错误(参考:2009-12-28)\n";
                    error = true;
                }
                break;
            case "EMAIL":
                if (isType(c_type, v) == false) {
                    msg += c_name + "填写错误(参考:abc@163.com)\n";
                    error = true;
                }
                break;
            case "CARD":
                if (isType(c_type, v) == false) {
                    msg += c_name + "填写错误,请检查\n";
                    error = true;
                }
                break;
            case "URL":
                if (isType(c_type, v) == false) {
                    msg += c_name + "填写错误(参考:http://www.xxxx.com)\n";
                    error = true;
                }
                break;
            case "IP":
                if (isType(c_type, v) == false) {
                    msg += c_name + "填写错误,请检查\n";
                    error = true;
                }
                break;
            case "ZIP":
                if (isType(c_type, v) == false) {
                    msg += c_name + "填写错误,请检查\n";
                    error = true;
                }
                break;
            case "MOB":
                if (isType(c_type, v) == false) {
                    msg += c_name + "填写错误,请检查\n";
                    error = true;
                }
                break;
            case "TEL":
                if (isType(c_type, v) == false) {
                    msg += c_name + "填写错误,请检查\n";
                    error = true;
                }
                break;
            case "ID1":
                if (isType(c_type, v) == false) {
                    msg += c_name + "填写错误(允许输入字母、数字和下划线)\n";
                    error = true;
                }
                break;
            case "ID2":
                if (isType(c_type, v) == false) {
                    msg += c_name + "填写错误(允许输入中文、字母、数字和下划线)\n";
                    error = true;
                }
                break;

            default: break;
        }
    }

    if ((c_minsize != undefined) && (c_minsize != "") && (error == false)) {
        if (strlen(v) < parseInt(c_minsize)) {
            //最小长度校验
            msg += c_name + "内容太短(最少需" + c_minsize + "个字节)\n";
            error = true;
        }
    }

    if ((c_maxsize != undefined) && (c_maxsize != "") && (error == false)) {
        if (strlen(v) > parseInt(c_maxsize)) {
            //最大长度校验
            msg += c_name + "超出最大长度(" + c_maxsize + "个字节)\n";
            error = true;
        }
    }

    if ((c_compare != undefined) && (c_compare != "") && (error == false)) {
        var chv = document.getElementById(c_compare).value;
        if ((chv != undefined) && (chv != "")) {
            if (chv != v) {
                msg += c_name + "内容不相符，请检查\n";
                error = true;
            }
        }
    }

    if (error) {
        alert(msg);
        document.getElementById(c_id).focus();
        return false;
    }
    else {
        return true;
    }
}

//***********************************验证支持脚本****************************************//
function isType(s, t) {
    /* 检测数据类型是否合法 */
    var RegExpPtn;
    if (t != "") {
        switch (s) {
            case "EN": //英文 
                RegExpPtn = /^[A-Za-z]+$/;
                if (!RegExpPtn.test(t)) { return false; } else { return true; }
                break;
            case "CN": //中文 
                RegExpPtn = /^[\u4e00-\u9fa5]+$/;
                if (!RegExpPtn.test(t)) { return false; } else { return true; }
                break;
            case "NUM": //实数 
                RegExpPtn = /^(\+|-)?\d+($|\.\d+$)/;
                if (!RegExpPtn.test(t)) { return false; } else { return true; }
                break;
            case "INT": //正整数 
                RegExpPtn = /^[0-9]*$/;
                if (!RegExpPtn.test(t)) { return false; } else { return true; }
                break;
            case "DATE": //日期yyyy-mm-dd 
                RegExpPtn = /^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$/;
                if (!RegExpPtn.test(t)) { return false; } else { return true; }
                break;
            case "EMAIL": //邮件 
                RegExpPtn = /\w[\w.-]+@[\w-]+(\.\w{2,})+/gi;
                if (!RegExpPtn.test(t)) { return false; } else { return true; }
                break;
            case "CARD": //身份证,也可直接调用isCard()函数 
                return isCard(t);
                break;
            case "URL": //网址 
                RegExpPtn = /^[a-zA-z]+\:\/\/(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$/;
                if (!RegExpPtn.test(t)) { return false; } else { return true; }
                break;
            case "IP": //IP地址,,也可直接调用isIP()函数 
                return isIP(t);
                break;
            case "ZIP": //邮编
                RegExpPtn = /^[0-9]{6}$/;
                if (!RegExpPtn.test(t)) { return false; } else { return true; }
                break;
            case "TEL": //电话
                var phoneRegWithArea = /^[0][1-9]{2,3}-[0-9]{5,8}$/;
                var phoneRegNoArea = /^[1-9]{1}[0-9]{5,8}$/;
                if (t.length > 9) {
                    if (phoneRegWithArea.test(t)) { return true; } else { return false; }
                } else {
                    if (phoneRegNoArea.test(t)) { return true; } else { return false; }
                }
                break;
            case "MOB": //手机
                RegExpPtn = /^[1][3,5][0-9]{9}$/;
                if (!RegExpPtn.test(t)) { return false; } else { return true; }
                break;
            case "ID1": //ID类型1,充许英文+数字+下划线(0~30字节) 
                RegExpPtn = /^[a-zA-Z][a-zA-Z0-9_]{0,29}$/;
                if (!RegExpPtn.test(t)) { return false; } else { return true; }
                break;
            case "ID2": //ID类型1,充许中文+英文+数字+下划线(0~30字节) 
                RegExpPtn = /^[a-zA-Z0-9_][_0-9a-zA-Z\u4e00-\u9fa5]{0,29}$/;
                if (!RegExpPtn.test(t)) { return false; } else { return true; }
                break;

            default: break;
        }
    } else {
        return false;
    }
}


function isnull(str) {
    /* 检测字符串是否为空 */
    var i;
    for (i = 0; i < str.length; i++) {
        if (str.charAt(i) != ' ') return false;
    }
    return true;
}

function isCard(obj) {
    /*功能：验证身份证号码是否有效 */
    var aCity = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南", 42: "湖北", 43: "湖南", 44: "广东", 45: "广西", 46: "海南", 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏", 61: "陕西", 62: "甘肃", 63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外" };

    var iSum = 0;
    var info = "";
    var strIDno = obj;
    var idCardLength = strIDno.length;
    if (!/^\d{17}(\d|x)$/i.test(strIDno) && !/^\d{15}$/i.test(strIDno)) {
        //alert("非法身份证号");     
        return false;
    }

    //在后面的运算中x相当于数字10,所以转换成a     
    strIDno = strIDno.replace(/x$/i, "a");

    if (aCity[parseInt(strIDno.substr(0, 2))] == null) {
        //alert("非法地区");     
        return false;
    }

    if (idCardLength == 18) {
        sBirthday = strIDno.substr(6, 4) + "-" + Number(strIDno.substr(10, 2)) + "-" + Number(strIDno.substr(12, 2));
        var d = new Date(sBirthday.replace(/-/g, "/"));
        if (sBirthday != (d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate())) {
            //alert("非法生日");     
            return false;
        }

        for (var i = 17; i >= 0; i--)
            iSum += (Math.pow(2, i) % 11) * parseInt(strIDno.charAt(17 - i), 11);

        if (iSum % 11 != 1) {
            //alert("非法身份证号");     
            return false;
        }
    }
    else if (idCardLength == 15) {
        sBirthday = "19" + strIDno.substr(6, 2) + "-" + Number(strIDno.substr(8, 2)) + "-" + Number(strIDno.substr(10, 2));
        var d = new Date(sBirthday.replace(/-/g, "/"));
        var dd = d.getFullYear().toString() + "-" + (d.getMonth() + 1) + "-" + d.getDate();
        if (sBirthday != dd) {
            //alert("非法生日");     
            return false;
        }
    }
    return true;
}

function isIP(obj) {
    var re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; //IP<a href="http://www.jb51.net/list/list_6_1.htm" target="_blank"><font color=red>正则</font></a>     
    if (re.test(obj)) {
        if (RegExp.$1 < 256 && RegExp.$2 < 256 && RegExp.$3 < 256 && RegExp.$4 < 256) return true;
    }
    //alert("请输入合法的计算机IP地址");     
    return false;
}

function strlen(str) {
    /* 取得字符串的字节长度 */
    var i;
    var len;
    len = 0;
    for (i = 0; i < str.length; i++) {
        if (str.charCodeAt(i) > 255) len += 2; else len++;
    }
    return len;
} 